使用 ARIMA 等经典方法对时间序列进行建模时,方差或波动率随时间的变化可能会导致问题。

ARCH(自回归条件异方差方法)提供了一种方法来模拟时间序列中随时间变化的方差变化,以增加或减少波动性。这种方法的扩展为 GARCH(广义自回归条件异方差)允许该方法支持随时间变化的波动率的变化。

方差问题

自回归模型可以为平稳 时间序列(AR)、具有趋势 (ARIMA) 和季节性成分 (SARIMA) 的单变量时间序列数据进行建模。

但这些模型无法对时间序列的方差改变情况进行建模。

处理方差改变的经典方法包括:使用变换来调整方差变化不大的时间序列,例如通过取Log 或使用 Box-Cox 变换。

在某些时间序列中,方差随时间不断变化。金融领域的时间序列称这种情形为波动性增加和减少。统计学称这为异方差。

如果方差的变化可以随时间相关,则可以使用自回归过程(例如 ARCH)对其进行建模。

什么是 ARCH 模型?

自回归条件异方差或 ARCH 是一种显式模拟时间序列中随时间变化的方差变化的方法。

具体而言,ARCH 方法将时间步长的方差建模为来自平均过程(例如零均值)的残差函数。该模型必须指定滞后参数来定义要包含在模型中的先前残差的数量。 在ARCH(p)模型中,我们假定 $\sigma_t^2$ 的数据生成过程 (DGP) 是MA(p)模型,也就是说: $$ \sigma_t^2=\delta_0+\sum_{i=1}^p \delta_i u_{t-i}^2 $$

什么是 GARCH 模型?

广义自回归条件异方差或 GARCH 是 ARCH 模型的扩展,它结合了移动平均分量和自回归分量。具体来说,该模型包括滞后方差项(例如,如果对另一个过程的白噪声残差建模时的观察结果),以及来自平均过程的滞后残差。

移动平均分量的引入允许模型对随时间变化的条件变化以及随时间变化的变化进行建模,包括有条件的方差增加和减少。

因此,该模型引入了一个新参数“p”,用于描述滞后方差项的数量:

GARCH 模型的一个普遍接受的符号是用p和q参数 GARCH(p, q) 指定 GARCH() 函数;例如 GARCH(1, 1) 将是一阶 GARCH 模型。

GARCH 模型包含 ARCH 模型,其中 GARCH(0, q) 等价于 ARCH(q) 模型。

GARCH模型形式。假设 $\left\{u_t\right\}$ 的 DGP是GARCH $(p, q)$ ,那么 $$ \begin{aligned} u_t & \sim N\left(0, \sigma_t^2\right) \\ \sigma_t^2 &=\delta_0+\sum_{i=1}^p \delta_i u_{t-i}^2+\sum_{j=1}^q \gamma_j \sigma_{t-j}^2 \end{aligned} $$

Python 中的 ARCH 和 GARCH 模型

在本节中,我们将了解如何使用arch 库在 Python 中开发 ARCH 和 GARCH 模型。

首先,让我们准备一个可用于这些示例的数据集。

测试数据集

我们可以创建一个具有变化方差模型的数据集。 最简单的情况是一系列随机噪声,其中均值为零,方差从 0.0 开始并稳步增加。 我们可以在 Python 中使用gauss() 函数来实现这一点,该函数生成具有指定均值和标准差的高斯随机数。

# create dataset
data = [gauss(0, i*0.01) for i in range(1,100+1)]
# create a simple white noise with increasing variance
from random import gauss
from random import seed
from matplotlib import pyplot
# seed pseudorandom number generator
seed(1)
# create dataset
data = [gauss(0, i*0.01) for i in range(0,100)]
# plot
pyplot.plot(data)
pyplot.show()

查看自相关性

# check correlations of squared observations
from random import gauss
from random import seed
from matplotlib import pyplot
from statsmodels.graphics.tsaplots import plot_acf
import numpy as np
# seed pseudorandom number generator
seed(1)
# create dataset
data = [gauss(0, i*0.01) for i in range(0,100)]
# square the dataset
squared_data = np.array([x**2 for x in data])
# create acf plot
plot_acf(squared_data)

ARCH 模型

构建 ARCH 模型涉及三个步骤:

GARCH 模型

我们可以像使用 arch 库一样轻松地拟合 GARCH 模型。

arch_model ()函数可以指定 GARCH 而不是 ARCH 模型 vol='GARCH' 以及两者的滞后参数。

# example of ARCH model
from random import gauss
from random import seed
from matplotlib import pyplot
from arch import arch_model
# seed pseudorandom number generator
seed(1)
# create dataset
data = [gauss(0, i*0.01) for i in range(0,100)]
# split into train/test
n_test = 10
train, test = data[:-n_test], data[-n_test:]
# define model
model = arch_model(train, mean='Zero', vol='GARCH', p=15, q=15)
# fit model
model_fit = model.fit()
# forecast the test set
yhat = model_fit.forecast(horizon=n_test)
# plot the actual variance
var = [i*0.01 for i in range(0,100)]
pyplot.plot(var[-n_test:])
# plot forecast variance
pyplot.plot(yhat.variance.values[-1, :])
pyplot.show()

参考资料